package lex.mtd.core.utils;

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

public class DaemonExecutor
{
	private static final ExecutorService pool = Executors
		.newCachedThreadPool( new DaemonThreadFactory() );

	public static ExecutorService getService()
	{
		return pool;
	}

	public static void execute( Runnable command )
	{
		pool.execute( command );
	}

	public static <T> Future<T> submit( Callable<T> task )
	{
		return pool.submit( task );
	}

	static class DaemonThreadFactory implements ThreadFactory
	{
		static final AtomicInteger poolNumber = new AtomicInteger( 1 );
		final ThreadGroup group;
		final AtomicInteger threadNumber = new AtomicInteger( 1 );
		final String namePrefix;

		DaemonThreadFactory()
		{
			SecurityManager s = System.getSecurityManager();
			group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup();
			namePrefix = "pool-" + poolNumber.getAndIncrement() + "-thread-";
		}

		public Thread newThread( Runnable r )
		{
			Thread t = new Thread( group, r, namePrefix + threadNumber.getAndIncrement(), 0 );
			if( false == t.isDaemon() )
				t.setDaemon( true );
			if( t.getPriority() != Thread.NORM_PRIORITY )
				t.setPriority( Thread.NORM_PRIORITY );
			return t;
		}
	}
}
